/*! DataTables Bootstrap 4 integration
 * ©2011-2017 SpryMedia Ltd - datatables.net/license
 */

/**
 * DataTables integration for Bootstrap 4. This requires Bootstrap 4 and
 * DataTables 1.10 or newer.
 *
 * This file sets the defaults and adds options to DataTables to style its
 * controls using Bootstrap. See http://datatables.net/manual/styling/bootstrap
 * for further information.
 */
(function (factory) {
  if (typeof define === 'function' && define.amd) {
    // AMD
    define(['jquery', 'datatables.net'], function ($) {
      return factory($, window, document);
    });
  } else if (typeof exports === 'object') {
    // CommonJS
    module.exports = function (root, $) {
      if (!root) {
        root = window;
      }

      if (!$ || !$.fn.dataTable) {
        // Require DataTables, which attaches to jQuery, including
        // jQuery if needed and have a $ property so we can access the
        // jQuery object that is used
        $ = require('datatables.net')(root, $).$;
      }

      return factory($, root, root.document);
    };
  } else {
    // Browser
    factory(jQuery, window, document);
  }
}(function ($, window, document, undefined) {
  'use strict';
  var DataTable = $.fn.dataTable;


  /* Set the defaults for DataTables initialisation */
  $.extend(true, DataTable.defaults, {
    dom:
      "<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
      "<'row'<'col-sm-12'tr>>" +
      "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
    renderer: 'bootstrap'
  });


  /* Default class modification */
  $.extend(DataTable.ext.classes, {
    sWrapper: "dataTables_wrapper dt-bootstrap4",
    sFilterInput: "form-control form-control-sm",
    sLengthSelect: "custom-select custom-select-sm form-control form-control-sm",
    sProcessing: "dataTables_processing card",
    sPageButton: "paginate_button page-item"
  });


  /* Bootstrap paging button renderer */
  DataTable.ext.renderer.pageButton.bootstrap = function (settings, host, idx, buttons, page, pages) {
    var api = new DataTable.Api(settings);
    var classes = settings.oClasses;
    var lang = settings.oLanguage.oPaginate;
    var aria = settings.oLanguage.oAria.paginate || {};
    var btnDisplay, btnClass, counter = 0;

    var attach = function (container, buttons) {
      var i, ien, node, button;
      var clickHandler = function (e) {
        e.preventDefault();
        if (!$(e.currentTarget).hasClass('disabled') && api.page() != e.data.action) {
          api.page(e.data.action).draw('page');
        }
      };

      for (i = 0, ien = buttons.length; i < ien; i++) {
        button = buttons[i];

        if (Array.isArray(button)) {
          attach(container, button);
        } else {
          btnDisplay = '';
          btnClass = '';

          switch (button) {
            case 'ellipsis':
              btnDisplay = '&#x2026;';
              btnClass = 'disabled';
              break;

            case 'first':
              btnDisplay = lang.sFirst;
              btnClass = button + (page > 0 ?
                '' : ' disabled');
              break;

            case 'previous':
              btnDisplay = lang.sPrevious;
              btnClass = button + (page > 0 ?
                '' : ' disabled');
              break;

            case 'next':
              btnDisplay = lang.sNext;
              btnClass = button + (page < pages - 1 ?
                '' : ' disabled');
              break;

            case 'last':
              btnDisplay = lang.sLast;
              btnClass = button + (page < pages - 1 ?
                '' : ' disabled');
              break;

            default:
              btnDisplay = button + 1;
              btnClass = page === button ?
                'active' : '';
              break;
          }

          if (btnDisplay) {
            node = $('<li>', {
              'class': classes.sPageButton + ' ' + btnClass,
              'id': idx === 0 && typeof button === 'string' ?
                settings.sTableId + '_' + button :
                null
            })
              .append($('<a>', {
                  'href': '#',
                  'aria-controls': settings.sTableId,
                  'aria-label': aria[button],
                  'data-dt-idx': counter,
                  'tabindex': settings.iTabIndex,
                  'class': 'page-link'
                })
                  .html(btnDisplay)
              )
              .appendTo(container);

            settings.oApi._fnBindAction(
              node, {action: button}, clickHandler
            );

            counter++;
          }
        }
      }
    };

    // IE9 throws an 'unknown error' if document.activeElement is used
    // inside an iframe or frame.
    var activeEl;

    try {
      // Because this approach is destroying and recreating the paging
      // elements, focus is lost on the select button which is bad for
      // accessibility. So we want to restore focus once the draw has
      // completed
      activeEl = $(host).find(document.activeElement).data('dt-idx');
    } catch (e) {
    }

    attach(
      $(host).empty().html('<ul class="pagination"/>').children('ul'),
      buttons
    );

    if (activeEl !== undefined) {
      $(host).find('[data-dt-idx=' + activeEl + ']').trigger('focus');
    }
  };


  return DataTable;
}));
